package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"net/http"
)

// 绑定数据库模型
type Todo struct {
	ID int `josn:"id"`
	Title string `json:"title"`
	Status bool `json:"status"`
}

// 声明全局
var (
	DB *gorm.DB
)

// 初始化数据库
func initMySQL() (err error){
	dsn := "root:123456@tcp(127.0.0.1:3306)/superstar?charset=utf8mb4&parseTime=True&loc=Local"
	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	return
}


func main() {
	// 初始化数据库
	err := initMySQL()
	if err != nil {
		panic(err)
	}
	// 模型绑定
	DB.AutoMigrate(&Todo{})

	// 1. 创建默认路由
	r := gin.Default()
	// 2. 指定前段html模板路径
	r.LoadHTMLGlob("templates/*/**")
	// 3. 告诉gin，去哪引用静态文件
	r.Static("/static", "./static")

	//r.StaticFile("favicon.ico", "")
	//r.Use(gi.favicon.New("./templates/favicon.ico"))



	// 訪問主頁，提示跳轉
	r.GET("/", func(c *gin.Context) {
		//c.String(http.StatusOK,"歡迎來到主頁，請訪問: /bubble")
		// 跳轉到 bubble/user 页面下
		c.Request.URL.Path = "/bubble"
		r.HandleContext(c)
	})

	// 页面展示， 单开页面后，js 会自动请求 页面数据，访问下面的 GET请求
	r.GET("/bubble", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil)
	})

	// 对清单操作的增删改查
	bubble := r.Group("/v1")
	{
		// 查找所有数据
		bubble.GET("/todo", func(c *gin.Context) {
			err = DB.Model(&Todo{}).Where("id = ?", 5).Update("status", true).Error
			var ts []Todo
			result := DB.Find(&ts)
			if err := result.Error; err != nil {
				c.JSON(http.StatusOK, gin.H{"message": "error"})
			} else {
				c.JSON(http.StatusOK, ts)
			}
		})
		// 增添
		bubble.POST("/todo", func(c *gin.Context) {
			var t Todo
			j := c.Request.Header.Get("Content-Type")
			fmt.Println("json: ", j)
			if j == "application/json;charset=UTF-8" {
				fmt.Println(123)
			}
			if c.BindJSON(&t) == nil {
				// 如果创建出错
				// result := DB.Create(&t) ;   err := result.Error
				if err = DB.Create(&t).Error; err != nil {
					c.JSON(http.StatusOK, gin.H{
						"error": "出错了，请传递正确的数据",
					})
				} else {
					c.JSON(http.StatusOK, gin.H{
						"code": 2000,
						"msg": "success",
						"data": t,
					})
				}
			}
		})

		// 更新操作
		bubble.PUT("todo/:id", func(c *gin.Context) {
			id := c.Param("id")
			//err =
			var t Todo
			if err = DB.Where("id = ?", id).First(&t).Error; err != nil {
				c.JSON(http.StatusOK, gin.H{"error": err.Error()})
				return
			}
			if err = DB.Save(&t).Error; err != nil {
				c.JSON(http.StatusOK, gin.H{"error": err.Error()})
			} else {
				c.JSON(http.StatusOK, t)
			}
		})

		// 删除
		bubble.DELETE("/todo/:id", func(c *gin.Context) {
			var (
				id string
				err bool
			)
			if id, err = c.Params.Get("id"); !err {
				return
			}
			fmt.Println(id)
		})
	}

	r.Run(":9000")
}
